package huffman;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
import java.lang.*; 
import java.util.*;
import java.util.ArrayList.*;
/**
 *
 * @author ennio
 */
public class Arbol {
    private String cadena_caracteres;
    private ArrayList<PseudoNodo> lista_final = new ArrayList<PseudoNodo>();
    
    public Arbol(){
    }
    public Arbol(String cadena_caracteres){
        this.cadena_caracteres= cadena_caracteres;
    }
    public void setCadena(String cadena_caracteres){
        this.cadena_caracteres= cadena_caracteres;
    }
    public String SumoDescribidor(){
        String SumoDescribidor;
        SumoDescribidor = "Caracter   ||   frec    ||   Cod   ||";
        for(int t=0; t<lista_final.size(); t++){
            SumoDescribidor = lista_final.get(t).toString()+ "\n";
        }
        return SumoDescribidor;
        
    }
    public void agregar(ArrayList<PseudoNodo> listaPseudoNodo, ArrayList<PseudoNodo> listaNodo ){
        for(int i= 0 ; i<listaNodo.size(); i++){
            lista_final.add(listaNodo.get(i));
        }
       Nodo nodo1 = new Nodo(listaPseudoNodo.get(0).getCaracter()+"", listaPseudoNodo.get(0).getFrecuencia());
       listaPseudoNodo.remove(0);
       Nodo nodo2 = new Nodo(listaPseudoNodo.get(0).getCaracter()+"", listaPseudoNodo.get(0).getFrecuencia());
       listaPseudoNodo.remove(0);
       Nodo padre = new Nodo(nodo2, nodo1);
       while(listaPseudoNodo.size()!=0){
           nodo2 = padre;
           nodo1 = new Nodo(listaPseudoNodo.get(0).getCaracter()+"", listaPseudoNodo.get(0).getFrecuencia());
           padre = new Nodo(nodo2, nodo1);
           listaPseudoNodo.remove(0);
           
       }
       for(int i= 0; i<lista_final.size(); i++){
           lista_final.get(i).setCodigo(padre.getString(lista_final.get(i).getCaracter()+""));
           System.out.println(lista_final.get(i).toString());
       }
       
    }

    
    //Revisa en todo el index, para ver iguales
    //Regresa la cadena con la frecuencia 
    public void despomponer(){}
    public void buscar_nodo(){}
    //Devuelve un String... que es el toString para mostrar...
    public void ingresar_cadena(){
        
        //Se hace un par de arrayList para poner luego en el arbol esos objetos... 
        int temFrecuencia;
        int indexLetra;
        ArrayList<Character> lista = new ArrayList<Character>();
        ArrayList<Integer> listaFrecuencia = new ArrayList<Integer>();
        ArrayList<PseudoNodo> listaPseudoNodo = new ArrayList<PseudoNodo>();
        for(int i=0; i<cadena_caracteres.length(); i++){
            char tempCaracter=  this.cadena_caracteres.charAt(i);
            boolean EstaElCaracter = false;
            for(int j=0; j<lista.size(); j++){
                if(lista.get(j).equals(tempCaracter)){EstaElCaracter=true;break;}
            }
            if (!EstaElCaracter){lista.add(tempCaracter);}
        }
        for(int i=0; i<lista.size(); i++){
            listaFrecuencia.add(0);
        }
        for(int i=0; i<lista.size(); i++){
            Character caracterContar = lista.get(i);
            int tempNumero = listaFrecuencia.get(i);
            for(int j= 0; j< cadena_caracteres.length(); j++){
                if (caracterContar.equals(this.cadena_caracteres.charAt(j))){
                    tempNumero++;
                }
            }
            listaFrecuencia.set(i, tempNumero);
        }
        
        for(int i= 0; i<lista.size(); i++){
            PseudoNodo nuevo = new PseudoNodo();
            nuevo.setFrecuencia(listaFrecuencia.get(i)); 
            nuevo.setCaracter(lista.get(i)); 
            listaPseudoNodo.add(nuevo);
        }
        for(int i=0; i<lista.size(); i++){
            System.out.println(listaPseudoNodo.get(i).getCaracter()+" "+ listaPseudoNodo.get(i).getFrecuencia());
        }
        System.out.println("");
        Collections.sort(listaPseudoNodo, PseudoNodo_orden);
        
        for(int i=0; i<lista.size(); i++){
            System.out.println(listaPseudoNodo.get(i).getCaracter()+" "+ listaPseudoNodo.get(i).getFrecuencia());
        }
        
        //char tempCaracter=  this.cadena_caracteres.charAt(this.cadena_caracteres.length());
        this.agregar(listaPseudoNodo, listaPseudoNodo);
    }
    
    static final Comparator<PseudoNodo> PseudoNodo_orden = new Comparator<PseudoNodo>() {
       public int compare(PseudoNodo n1, PseudoNodo n2){
           return (n1.getFrecuencia()-n2.getFrecuencia());
       }
    };
    
}
